package com.example.flyweight;

/**
 * 享元模式演示类
 * 展示享元模式如何通过对象共享来减少内存使用
 */
public class FlyweightDemo {
    
    public static void main(String[] args) {
        System.out.println("=== 享元模式演示 ===\n");
        
        // 演示对象共享
        demonstrateObjectSharing();
        
        System.out.println("\n=== 内存使用对比 ===\n");
        
        // 演示内存使用对比
        demonstrateMemoryUsage();
    }
    
    /**
     * 演示对象共享
     */
    private static void demonstrateObjectSharing() {
        System.out.println("1. 创建多个相同半径的圆形对象：");
        
        // 创建多个相同半径的圆形
        Shape circle1 = ShapeFactory.getCircle(5);
        Shape circle2 = ShapeFactory.getCircle(5);
        Shape circle3 = ShapeFactory.getCircle(5);
        
        System.out.println("\n2. 创建不同半径的圆形对象：");
        
        // 创建不同半径的圆形
        Shape circle4 = ShapeFactory.getCircle(10);
        Shape circle5 = ShapeFactory.getCircle(10);
        Shape circle6 = ShapeFactory.getCircle(15);
        
        System.out.println("\n3. 绘制所有圆形（使用不同的外部状态）：");
        
        // 使用不同的外部状态（位置和颜色）绘制圆形
        circle1.draw(10, 20, "红色");
        circle2.draw(30, 40, "蓝色");
        circle3.draw(50, 60, "绿色");
        circle4.draw(70, 80, "黄色");
        circle5.draw(90, 100, "紫色");
        circle6.draw(110, 120, "橙色");
        
        System.out.println("\n4. 缓存池统计：");
        System.out.println("缓存池中的对象数量: " + ShapeFactory.getShapeCount());
    }
    
    /**
     * 演示内存使用对比
     */
    private static void demonstrateMemoryUsage() {
        System.out.println("不使用享元模式（每次都创建新对象）：");
        
        // 模拟不使用享元模式的情况
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            // 每次都创建新的圆形对象（模拟）
            new Circle(5);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("创建1000个圆形对象耗时: " + (endTime - startTime) + "ms");
        
        System.out.println("\n使用享元模式（共享对象）：");
        
        // 清空缓存池
        ShapeFactory.clearCache();
        
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            // 使用享元模式，相同半径的圆形会被共享
            ShapeFactory.getCircle(5);
        }
        endTime = System.currentTimeMillis();
        System.out.println("获取1000个圆形对象耗时: " + (endTime - startTime) + "ms");
        System.out.println("实际创建的圆形对象数量: " + ShapeFactory.getShapeCount());
        
        System.out.println("\n=== 享元模式优势总结 ===");
        System.out.println("✓ 减少对象创建数量");
        System.out.println("✓ 降低内存使用");
        System.out.println("✓ 提高程序性能");
        System.out.println("✓ 特别适用于大量相似对象的场景");
    }
}
